// 请你设计一个迭代器类，包括以下内容：

// 一个构造函数，输入参数包括：一个 有序且字符唯一 的字符串 characters（该字符串只包含小写英文字母）和一个数字 combinationLength 。
// 函数 next() ，按 字典序 返回长度为 combinationLength 的下一个字母组合。
// 函数 hasNext() ，只有存在长度为 combinationLength 的下一个字母组合时，才返回 True；否则，返回 False。
//  

// 示例：

// CombinationIterator iterator = new CombinationIterator("abc", 2); // 创建迭代器 iterator

// iterator.next(); // 返回 "ab"
// iterator.hasNext(); // 返回 true
// iterator.next(); // 返回 "ac"
// iterator.hasNext(); // 返回 true
// iterator.next(); // 返回 "bc"
// iterator.hasNext(); // 返回 false
//  

// 提示：

// 1 <= combinationLength <= characters.length <= 15
// 每组测试数据最多包含 10^4 次函数调用。
// 题目保证每次调用函数 next 时都存在下一个字母组合。

#include "stdc++.h"

/* 生成法
*/
class CombinationIterator {
public:
    CombinationIterator(string characters, int combinationLength) : s(characters) {
        pos.resize(combinationLength);
        iota(pos.begin(), pos.end(), 0); // pos {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    }
    
    string next() {
        string res{};
        for (int p : pos) {
            res += s[p];
        }
        int i{-1};
        for (int k = pos.size() - 1; k >= 0; --k) {
            if (pos[k] != s.size() - pos.size() + k) {
                i = k;
                break;
            }
        }
        if (i == -1) {
            finished = true;
        } else {
            ++pos[i];
            for (int j{i + 1}; j < pos.size(); ++j) {
                pos[j] = pos[j - 1] + 1;
            }
        }
        return res;
    }
    
    bool hasNext() {
        return !finished;
    }
private:
    vector<int> pos{};
    string s{};
    bool finished{false};
};

/**
 * Your CombinationIterator object will be instantiated and called as such:
 * CombinationIterator* obj = new CombinationIterator(characters, combinationLength);
 * string param_1 = obj->next();
 * bool param_2 = obj->hasNext();
 */